MVVM প্যাটার্নে ViewModel এবং Model এর মধ্যে যোগাযোগ স্থাপন করার মাধ্যমে ডেটা প্রসেসিং এবং ভিউ আপডেটের কাজ সঠিকভাবে সম্পাদিত হয়। ViewModel হল View এর জন্য ডেটা প্রস্তুতকারী এবং Model হল সেই ডেটা ধারণকারী অংশ।
ViewModel এর কাজ হল Model থেকে ডেটা নিয়ে তা View-এ উপস্থাপনযোগ্য আকারে প্রদান করা, আবার View থেকে ইনপুট গ্রহণ করে তা Model-এ প্রেরণ করা। এই সম্পর্ক স্থাপনের জন্য বিভিন্ন যোগাযোগ পদ্ধতি এবং কৌশল ব্যবহার করা হয়, যা একে অপরের মধ্যে সঠিকভাবে ডেটা প্রেরণ এবং গ্রহণের সুযোগ দেয়।
Direct Binding (Data Binding)
Data Binding উদাহরণ:
// ViewModel
public class ProductViewModel : INotifyPropertyChanged
{
private Product _product;
public ProductViewModel()
{
_product = new Product();
}
public string ProductName
{
get { return _product.Name; }
set
{
_product.Name = value;
OnPropertyChanged();
}
}
public decimal ProductPrice
{
get { return _product.Price; }
set
{
_product.Price = value;
OnPropertyChanged();
}
}
}
<!-- View (XAML) -->
<TextBox Text="{Binding ProductName}" />
<TextBox Text="{Binding ProductPrice}" />
এই উদাহরণে, ViewModel-এ ডেটা পরিবর্তন হলেই এটি View-এ রিফ্লেক্ট হবে, এবং View থেকে ইনপুট পরিবর্তন হলে তা Model-এ প্রেরিত হবে।
Command Pattern
Command Pattern উদাহরণ:
public class SaveCommand : ICommand
{
private readonly ProductViewModel _viewModel;
public SaveCommand(ProductViewModel viewModel)
{
_viewModel = viewModel;
}
public bool CanExecute(object parameter)
{
return !string.IsNullOrEmpty(_viewModel.ProductName) && _viewModel.ProductPrice > 0;
}
public void Execute(object parameter)
{
var product = new Product
{
Name = _viewModel.ProductName,
Price = _viewModel.ProductPrice
};
_viewModel.SaveProduct(product);
}
public event EventHandler CanExecuteChanged;
}
<Button Content="Save" Command="{Binding SaveCommand}" />
এখানে, SaveCommand ViewModel এর মধ্যে তৈরি করা হয়েছে যা Model এ প্রোডাক্ট সেভ করার কাজ করে।
Event Aggregator Pattern
Event Aggregator Pattern উদাহরণ:
public class EventAggregator
{
private readonly Dictionary<Type, List<Delegate>> _subscribers = new Dictionary<Type, List<Delegate>>();
public void Subscribe<TEvent>(Action<TEvent> action)
{
if (!_subscribers.ContainsKey(typeof(TEvent)))
{
_subscribers[typeof(TEvent)] = new List<Delegate>();
}
_subscribers[typeof(TEvent)].Add(action);
}
public void Publish<TEvent>(TEvent eventData)
{
if (_subscribers.ContainsKey(typeof(TEvent)))
{
foreach (var action in _subscribers[typeof(TEvent)])
{
((Action<TEvent>)action).Invoke(eventData);
}
}
}
}
// ViewModel A
public class ProductViewModelA
{
private readonly EventAggregator _eventAggregator;
public ProductViewModelA(EventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe<ProductCreatedEvent>(OnProductCreated);
}
private void OnProductCreated(ProductCreatedEvent productEvent)
{
// Handle event here
}
}
// ViewModel B
public class ProductViewModelB
{
private readonly EventAggregator _eventAggregator;
public ProductViewModelB(EventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
public void CreateProduct(Product product)
{
_eventAggregator.Publish(new ProductCreatedEvent(product));
}
}
এখানে, ProductViewModelA এবং ProductViewModelB একে অপরের সাথে যোগাযোগ করতে EventAggregator ব্যবহার করছে।
এইভাবে ViewModel এবং Model এর মধ্যে যোগাযোগ স্থাপন করা হয়, যা অ্যাপ্লিকেশনটির কার্যকারিতা ও নির্ভুলতা নিশ্চিত করে।
common.read_more